import { request } from '../request'
import type { PaginatedResponse, PaginationParams } from '../types'

/**
 * 批量操作响应
 */
export interface BulkOperationResponse {
  success: number
  failed: number
  not_found: number
  message: string
}

/**
 * CRUD API 工厂函数配置选项
 */
export interface CrudApiOptions {
  /** ID字段名称（默认为复数形式去s加_ids，如 leads -> lead_ids） */
  idFieldName?: string
}

/**
 * CRUD API 工厂函数
 * 用于快速创建标准的增删改查API模块，减少重复代码
 *
 * @template T - 实体类型
 * @template TCreate - 创建数据类型
 * @template TUpdate - 更新数据类型
 * @template TFilter - 筛选参数类型
 *
 * @param resourcePath - API资源路径（如: 'v1/leads/'）
 * @param options - 配置选项
 * @returns 包含标准CRUD方法的API对象
 *
 * @example
 * ```ts
 * export const leadApi = createCrudApi<Lead, LeadCreate, LeadUpdate>('v1/leads/', { idFieldName: 'lead_ids' })
 * ```
 */
export function createCrudApi<
  T,
  TCreate = Partial<T>,
  TUpdate = Partial<T>,
  TFilter extends Record<string, unknown> = Record<string, unknown>,
>(resourcePath: string, options: CrudApiOptions = {}) {
  // 确保路径以 / 结尾
  const basePath = resourcePath.endsWith('/') ? resourcePath : `${resourcePath}/`

  // 推断ID字段名称：leads/ -> lead_ids, properties/ -> property_ids
  const defaultIdField = basePath
    .replace(/\/$/, '')
    .split('/')
    .pop()
    ?.replace(/s$/, '_ids') || 'ids'

  const idFieldName = options.idFieldName || defaultIdField

  return {
    /**
     * 获取列表（分页）
     * @param params 分页参数 + 筛选条件
     */
    getList(params: PaginationParams & TFilter): Promise<PaginatedResponse<T>> {
      return request.get(basePath, { params })
    },

    /**
     * 获取单条记录详情
     * @param id 记录ID
     */
    getById(id: number): Promise<T> {
      return request.get(`${basePath}${id}`)
    },

    /**
     * 创建记录
     * @param data 创建数据
     */
    create(data: TCreate): Promise<T> {
      return request.post(basePath, data)
    },

    /**
     * 更新记录
     * @param id 记录ID
     * @param data 更新数据
     */
    update(id: number, data: TUpdate): Promise<T> {
      return request.put(`${basePath}${id}`, data)
    },

    /**
     * 删除记录（软删除）
     * @param id 记录ID
     */
    delete(id: number): Promise<void> {
      return request.delete(`${basePath}${id}`)
    },

    /**
     * 批量删除记录（软删除）
     * @param ids 记录ID数组
     */
    bulkDelete(ids: number[]): Promise<BulkOperationResponse> {
      return request.post(`${basePath}bulk-delete`, {
        [idFieldName]: ids,
      })
    },

    /**
     * 恢复已删除记录
     * @param id 记录ID
     */
    restore(id: number): Promise<T> {
      return request.post(`${basePath}${id}/restore`)
    },

    /**
     * 批量恢复已删除记录
     * @param ids 记录ID数组
     */
    bulkRestore(ids: number[]): Promise<BulkOperationResponse> {
      return request.post(`${basePath}bulk-restore`, {
        [idFieldName]: ids,
      })
    },

    /**
     * 获取已删除记录列表
     * @param params 分页参数
     */
    getDeletedList(params: PaginationParams & TFilter): Promise<PaginatedResponse<T>> {
      return request.get(`${basePath}deleted/list`, { params })
    },
  }
}
